import FileSaver from "file-saver";

/**
 * 组装导出表格
 * @param data 页面导出数据
 * @param name 文件名
 * @param keys 自定义导出字段
 * @param option 对齐方式
 * @param columns 页面字段
 * @param sheetOpt 多sheet
 */
import ExcelJS from "exceljs";
import {info, success} from "@/utils/msg";

export function exportExcel({data, name, keys, option, columns, sheetOpt}) {
    // 创建工作簿
    const workbook = new ExcelJS.Workbook();
    // 添加工作表，名为sheet1
    const sheet1 = workbook.addWorksheet("sheet1");
    sheet1.columns = getColumns(columns)
    // 将数据写入工作表
    if (data && data.length >= 1) {
        if (data.length > 2000) {
            info("数据超过2000条，系统使用异步导出，请等待提示！")
            setExportDataAsy(data, sheet1, columns).then(() => {
                // 标题宽度
                setColumnWidth({sheet: sheet1, option: option})
                setRowHorizontal({sheet: sheet1, option: option})
                new Promise(() => {
                    saveXlsx(workbook, name)
                }).then()
            })
        } else {
            setExportData(data, sheet1, columns);
            // 标题宽度
            setColumnWidth({sheet: sheet1, option: option})
            setRowHorizontal({sheet: sheet1, option: option})
            saveXlsx(workbook, name)
        }

    } else {
        // 标题宽度
        setColumnWidth({sheet: sheet1, option: option})
        setRowHorizontal({sheet: sheet1, option: option})
        saveXlsx(workbook, name)
    }

}

/**
 * 获取导出excel标题列
 * @param keys 自定义导出字段
 * @param columns 页面字段
 * @returns {*[]}
 */
function getColumns(columns) {
    let res = []
    for (const column of columns) {
        const width = column.width
        res.push({
            header: column.title, key: column.field, width: isNaN(width) ? 20 : width / 10
        })
    }
    return res
}

/**
 * 设置全部单元格对齐方式
 * @param sheet
 * @param option
 */
function setRowHorizontal({sheet, option}) {
    sheet.eachRow((row, rowNumber) => {
        // 遍历每个单元格
        row.eachCell((cell) => {
            // 设置边框样式
            // cell.border = {
            //     top: {style: 'thin'},
            //     left: {style: 'thin'},
            //     bottom: {style: 'thin'},
            //     right: {style: 'thin'}
            // };
            // 设置居中对齐
            cell.alignment = {
                vertical: 'middle', horizontal: option.align
            };
        });
        row.font = {
            size: 12, name: '宋体'
        };
    });
}

/**
 * 根据表格单元格值设置单元格宽度
 * @param sheet 表格
 * @param option 单元格内容对齐方式
 */
function setColumnWidth({sheet, option}) {
    sheet.columns.forEach(function (column, i) {
        let maxLength = 0;
        column["eachCell"]({includeEmpty: true}, function (cell) {
            let columnLength = cell.value ? cell.value.toString().length : 10;
            if (new RegExp("[\\u4E00-\\u9FFF]+", "g").test(cell.value)) {
                columnLength = columnLength * 2
            }
            maxLength = 10
            if (columnLength >= maxLength) {
                maxLength = columnLength + 3;
            }
            column.width = maxLength > 30 ? 30 : maxLength;
        });

        // 列头样式
        let cell = sheet.getCell(column.letter + '1')
        cell.fill = {
            type: 'pattern', pattern: 'solid', fgColor: {argb: 'ff808080'}, bgColor: {argb: '00000000'},
        }
        cell.font = {
            color: {argb: 'ffffffff'},
        }
        cell.alignment = {
            horizontal: option.align, vertical: 'middle',
        }
    });
}

/**
 * 导出表格赋值
 * @param data 导出数据
 * @param keys 自定义导出字段 t_id
 * @param sheet 表格
 * @param columns 页面表单字段
 */
function setExportData(data, sheet, columns) {
    let rows = [];
    data.map((row) => {
        let column = {};
        columns.forEach((item) => {
            column[item.field] = getRowValue(item, row);
        });
        let values = Object.values(column);
        rows.push(values);
    });
    sheet.addRows(rows);
}

/**
 * 导出表格赋值
 * @param data 导出数据
 * @param keys 自定义导出字段 t_id
 * @param sheet 表格
 * @param columns 页面表单字段
 */
async function setExportDataAsy(data, sheet, columns) {
    return new Promise((resolve) => {
        // 为了模拟异步，使用 setTimeout 将操作放入任务队列
        setTimeout(() => {
            let rows = [];
            data.map((row) => {
                let column = {};
                columns.forEach((item) => {
                    column[item.field] = getRowValue(item, row);
                });
                let values = Object.values(column);
                rows.push(values);
            });
            sheet.addRows(rows);
            resolve();
        }, 300);
    });
}

/**
 * 获取行数据值
 * @param columns 页面表单字段
 * @param row 行数据
 * @param key 字段
 * @returns {*}
 */
function getRowValue(column, row) {
    let value = row[column.field]
    if (column.params && column.params.dictValueLabel && column.params.dictValueLabel[value]) {
        value = column.params.dictValueLabel[value];
    }
    return value
}

/**
 * 导出
 * @param workbook 工作表格
 * @param name 导出文件名称
 */
function saveXlsx(workbook, name) {
    // 导出表格文件
    workbook.xlsx.writeBuffer().then((buffer) => {
        let file = new Blob([buffer], {type: "application/octet-stream"});
        FileSaver.saveAs(file, name + ".xlsx");
        success("导出成功[" + name + ".xlsx]")
    }).catch(error => {
        error("导出失败[" + name + ".xlsx]")
        console.log('Error writing excel export', error)
    })
}
